package com.skyd.core.android.game;

import java.util.ArrayList;

import android.graphics.Canvas;
import android.graphics.Rect;

public abstract class GameDisplayWallpaperService extends GameWallpaperService implements
		IGameDisplayArea {
	
	/**
	 * 初始值为new ArrayList<GameScene>()。 功能注释：场景列表
	 */
	private ArrayList<GameScene> _SceneList = new ArrayList<GameScene>();

	/**
	 * 获取SceneList。 功能注释：场景列表
	 * 
	 * @return 当前的ArrayList<GameScene>类型的值
	 */
	protected ArrayList<GameScene> getSceneList() {
		return _SceneList;
	}

	/**
	 * 设置SceneList。 功能注释：场景列表
	 * 
	 * @param value
	 *            要设置的ArrayList<GameScene>类型值
	 */
	protected void setSceneList(ArrayList<GameScene> value) {
		_SceneList = value;
	}

	/**
	 * 设置SceneList为其默认值(new ArrayList<GameScene>())。 功能注释：场景列表
	 */
	protected void setSceneListToDefault() {
		setSceneList(new ArrayList<GameScene>());
	}

	@Override
	protected void PaintInThread(Canvas c) {
		draw(c);
	}

	@Override
	protected void UpdateInThread() {
		update();
	}

	/**
	 * 添加场景到当前显示区域
	 * 
	 * @param scene
	 *            场景
	 * @throws Exception
	 *             该场景已存在于另一显示区域中 或 同名场景已存在于此显示区域
	 */
	public void addScene(GameScene scene) throws Exception {
		if (scene.getParentDisplayArea() != null
				&& scene.getParentDisplayArea() != this)
			throw new Exception("该场景已存在于另一显示区域中！");
		for (GameScene f : _SceneList) {
			if (f.getName() == scene.getName())
				throw new Exception("同名场景已存在于此显示区域！");
		}
		scene.setParentDisplayArea(this);
		_SceneList.add(scene);
		scene.updateDisplayAreaSize();
		scene.updateDisplayAreaScaleReferenceValue();
	}

	/**
	 * 移出场景自当前显示区域
	 * 
	 * @param scene
	 *            场景
	 * @throws Exception
	 *             该场景并未存在于此显示区域中
	 */
	public void removeScene(GameScene scene) throws Exception {
		if (_SceneList.contains(scene)) {
			scene.setParentDisplayAreaToDefault();
			_SceneList.remove(scene);
		} else
			throw new Exception("该场景并未存在于此显示区域中！");
	}

	/**
	 * 初始值为0。 功能注释：当前显示的场景索引位置
	 */
	private int _DisplaySceneIndex = 0;
	/**
	 * DrawingBegin事件监听器列表。当绘图开始时触发
	 */
	private ArrayList<OnDrawingBeginListener> _DrawingBeginListenerList = null;
	/**
	 * DrawingEnd事件监听器列表。当绘图结束时触发
	 */
	private ArrayList<OnDrawingEndListener> _DrawingEndListenerList = null;

	/**
	 * 获取DisplaySceneIndex。 功能注释：当前显示的场景索引位置
	 * 
	 * @return 当前的int类型的值
	 */
	public int getDisplaySceneIndex() {
		return _DisplaySceneIndex;
	}

	/**
	 * 设置DisplaySceneIndex。 功能注释：当前显示的场景索引位置
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public void setDisplaySceneIndex(int value) {
		_DisplaySceneIndex = value;
	}

	/**
	 * 设置DisplaySceneIndex为其默认值(0)。 功能注释：当前显示的场景索引位置
	 */
	public void setDisplaySceneIndexToDefault() {
		setDisplaySceneIndex(0);
	}

	/**
	 * 通过名称查找场景，并将其设为当前场景，如果未找到则抛出异常
	 * 
	 * @param name
	 *            场景名称
	 * @throws Exception
	 *             未找到此名称的场景
	 */
	public void setDisplaySceneName(String name) throws Exception {
		for (int i = 0; i < _SceneList.size(); i++) {
			if (_SceneList.get(i).getName() == name) {
				_DisplaySceneIndex = i;
				return;
			}
		}
		throw new Exception("未找到名为" + name + "的场景");
	}

	/**
	 * 获取当前显示的场景的名称
	 * 
	 * @return 当前显示的场景的名称
	 */
	public String getDisplaySceneName() {
		return getDisplayScene().getName();
	}

	/**
	 * 获取当前显示的场景
	 * 
	 * @return 当前显示的场景
	 */
	public GameScene getDisplayScene() {
		return _SceneList.get(_DisplaySceneIndex);
	}

	/**
	 * 根据名称获取显示区域中的场景，如果不存在则返回null
	 * 
	 * @param name
	 *            场景名称
	 * @return 场景
	 */
	public GameScene getSceneByName(String name) {
		for (GameScene f : _SceneList) {
			if (f.getName() == name)
				return f;
		}
		return null;
	}

	/**
	 * 更新显示区域及其当前显示的子项
	 */
	public void update() {
		if (_SceneList.size() > 0)
			getDisplayScene().update();
	}

	/**
	 * 绘制显示区域及其当前显示的子项
	 * 
	 * @param holder
	 *            SurfaceHolder
	 */
	public void draw(Canvas c) {
		if (c == null)
			return;
		onDrawingBegin(c, null);
		if (_SceneList.size() > 0) {
			getDisplayScene().draw(c,null);
		}
		onDrawingEnd(c, null);
	}

	/**
	 * 当绘图开始时触发
	 */
	public interface OnDrawingBeginListener {
		/**
		 * 触发DrawingBegin事件时执行的方法
		 * 
		 * @param sender
		 *            触发DrawingBegin事件的对象
		 */
		public abstract void OnEvent(Object sender, Canvas c, Rect displayRect);
	}

	/**
	 * 增加一个DrawingBegin事件的监听器，返回是否成功增加。事件功能注释：当绘图开始时触发
	 * 
	 * @param listener
	 *            DrawingBegin事件监听器对象
	 * @return 是否成功增加。如果该监听器对象已存在，则返回false。
	 */
	public boolean addOnDrawingBeginListener(OnDrawingBeginListener listener) {
		if (_DrawingBeginListenerList == null)
			_DrawingBeginListenerList = new ArrayList<OnDrawingBeginListener>();
		else if (_DrawingBeginListenerList.contains(listener))
			return false;
		_DrawingBeginListenerList.add(listener);
		return true;
	}

	/**
	 * 移除一个DrawingBegin事件的监听器，返回是否成移除。事件功能注释：当绘图开始时触发
	 * 
	 * @param listener
	 *            DrawingBegin事件监听器对象
	 * @return 是否成功移除。如果该监听器对象不存在，则返回false。
	 */
	public boolean removeOnDrawingBeginListener(OnDrawingBeginListener listener) {
		if (_DrawingBeginListenerList == null
				|| !_DrawingBeginListenerList.contains(listener))
			return false;
		_DrawingBeginListenerList.remove(listener);
		return true;
	}

	/**
	 * 清空所有DrawingBegin事件的监听器。事件功能注释：当绘图开始时触发
	 */
	public void clearOnDrawingBeginListeners() {
		if (_DrawingBeginListenerList != null)
			_DrawingBeginListenerList.clear();
	}

	/**
	 * 当绘图开始时触发
	 */
	protected void onDrawingBegin(Canvas c, Rect displayRect) {
		if (_DrawingBeginListenerList != null)
			for (OnDrawingBeginListener listener : _DrawingBeginListenerList) {
				listener.OnEvent(this, c, displayRect);
			}
	}

	/**
	 * 当绘图结束时触发
	 */
	public interface OnDrawingEndListener {
		/**
		 * 触发DrawingEnd事件时执行的方法
		 * 
		 * @param sender
		 *            触发DrawingEnd事件的对象
		 */
		public abstract void OnEvent(Object sender, Canvas c, Rect displayRect);
	}

	/**
	 * 增加一个DrawingEnd事件的监听器，返回是否成功增加。事件功能注释：当绘图结束时触发
	 * 
	 * @param listener
	 *            DrawingEnd事件监听器对象
	 * @return 是否成功增加。如果该监听器对象已存在，则返回false。
	 */
	public boolean addOnDrawingEndListener(OnDrawingEndListener listener) {
		if (_DrawingEndListenerList == null)
			_DrawingEndListenerList = new ArrayList<OnDrawingEndListener>();
		else if (_DrawingEndListenerList.contains(listener))
			return false;
		_DrawingEndListenerList.add(listener);
		return true;
	}

	/**
	 * 移除一个DrawingEnd事件的监听器，返回是否成移除。事件功能注释：当绘图结束时触发
	 * 
	 * @param listener
	 *            DrawingEnd事件监听器对象
	 * @return 是否成功移除。如果该监听器对象不存在，则返回false。
	 */
	public boolean removeOnDrawingEndListener(OnDrawingEndListener listener) {
		if (_DrawingEndListenerList == null
				|| !_DrawingEndListenerList.contains(listener))
			return false;
		_DrawingEndListenerList.remove(listener);
		return true;
	}

	/**
	 * 清空所有DrawingEnd事件的监听器。事件功能注释：当绘图结束时触发
	 */
	public void clearOnDrawingEndListeners() {
		if (_DrawingEndListenerList != null)
			_DrawingEndListenerList.clear();
	}

	/**
	 * 当绘图结束时触发
	 */
	protected void onDrawingEnd(Canvas c, Rect displayRect) {
		if (_DrawingEndListenerList != null)
			for (OnDrawingEndListener listener : _DrawingEndListenerList) {
				listener.OnEvent(this, c, displayRect);
			}
	}

	@Override
	public int getHeight() {
		return GameMaster.getScreenHeight();
	}

	@Override
	public int getWidth() {
		return GameMaster.getScreenWidth();
	}
	
	

}
